package cn.hhz.charging.device.canal;

import cn.hhz.charging.device.pojo.po.StationCanalPO;
import cn.hhz.charging.device.pojo.po.StationPO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

/**
 * 场站数据同步处理器 数据库表  charging_station 要和Redis保持一致
 * Canal发现数据变化后会调用StationSyncHandler里的方法
 *
 * charging_station插入数据 调用 StationSyncHandler#insert Redis 需要插入
 *
 * charging_station更新数据 调用 StationSyncHandler#update Redis 需要更新
 *
 * charging_station删除数据 调用 StationSyncHandler#delete Redis 需要删除
 *
 *
 */
@Slf4j
@Component
@CanalTable("charging_station")
public class StationSyncHandler implements EntryHandler<StationCanalPO> {

    @Autowired
    private RedisTemplate<String,StationPO> redisTemplate;

    @Override
    public void insert(StationCanalPO stationPO) {
        log.debug("数据表 charging_station 插入了新的数据:{}",stationPO);
        EntryHandler.super.insert(stationPO);
        //把数据库新增的数据插入到Redis
        log.debug("数据表 charging_station 插入了新的数据:{},同步插入到Redis",stationPO);
        ValueOperations<String, StationPO> str = redisTemplate.opsForValue();
        String key = "station_info_string_" + stationPO.getId();
        StationPO cacheStationPO = new StationPO();
        BeanUtils.copyProperties(stationPO,cacheStationPO);
        str.set(key,cacheStationPO);
        log.debug("数据表 charging_station 插入了新的数据:{},成功同步插入到Redis",stationPO);
    }

    @Override
    public void update(StationCanalPO before, StationCanalPO after) {
        log.debug("数据表 charging_station 更新了数据:更新之前{},更新之后:{}",before,after);
        EntryHandler.super.update(before, after);
        //把数据库新增的数据更新到Redis
        log.debug("数据表 charging_station 更新的数据:{},同步更新到Redis",after);
        ValueOperations<String, StationPO> str = redisTemplate.opsForValue();
        String key = "station_info_string_" + after.getId();
        //key一样的 value会覆盖,实现更新
        StationPO cacheStationPO = new StationPO();
        BeanUtils.copyProperties(after,cacheStationPO);
        str.set(key,cacheStationPO);
        log.debug("数据表 charging_station 更新的数据:{},成功同步更新到Redis",after);
    }

    @Override
    public void delete(StationCanalPO stationPO) {
        log.debug("数据表 charging_station 删除了数据:{}",stationPO);
        EntryHandler.super.delete(stationPO);
        log.debug("数据表 charging_station 删除了数据:{},同步删除Redis",stationPO);
        //ValueOperations<String, StationPO> str = redisTemplate.opsForValue();
        String key = "station_info_string_" + stationPO.getId();
        //删除一个key和具体的类型无关, delete方法无需发到具体的类型实现
        redisTemplate.delete(key);
    }
}
